package org.yelongframework.zip.executor;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.function.Function;

import org.yelongframework.lang.Nullable;
import org.yelongframework.zip.file.ReadZipFile;
import org.yelongframework.zip.file.WriteZipFile;

/**
 * 压缩执行器
 * 
 * @since 1.0.0
 */
public interface ZipExecutor {

	// ==================================================压缩==================================================

	/**
	 * 压缩文件
	 * 
	 * @param writeZipFile 压缩文件项集合
	 * @param file         压缩后输出到的文件
	 * @throws IOException 流异常
	 */
	void zip(WriteZipFile writeZipFile, File file) throws IOException;

	/**
	 * 压缩文件
	 * 
	 * @param writeZipFile 压缩文件项集合
	 * @param outputStream 压缩后输出到的流
	 * @throws IOException 流异常
	 */
	void zip(WriteZipFile writeZipFile, OutputStream outputStream) throws IOException;

	// ==================================================解压缩==================================================

	/**
	 * 解压缩文件
	 * 
	 * @param file 压缩文件
	 * @throws IOException 流异常
	 */
	void unzip(File file) throws IOException;

	/**
	 * 解压缩文件
	 * 
	 * @param file          压缩文件
	 * @param unzipRootPath 解压后文件存储的根目录
	 * @throws IOException 流异常
	 */
	void unzip(File file, @Nullable String unzipRootPath) throws IOException;

	/**
	 * 解压缩文件
	 * 
	 * @param file                 压缩文件
	 * @param unZipFileNameFuction 解压文件名称函数，制定文件解压后的目录文件。入参为压缩项在压缩包中的全路径，出参为解压至本地的全路径
	 * @throws IOException 流异常
	 */
	void unzip(File file, Function<String, String> unZipFileNameFuction) throws IOException;

	// ==================================================读取压缩文件==================================================

	/**
	 * 解压缩文件
	 * 
	 * @param file 压缩文件
	 * @return 读取压缩文件项集合
	 * @throws IOException 流异常
	 */
	ReadZipFile readZipFile(File file) throws IOException;

}
